#ifndef MAPINFOTAB_H
#define MAPINFOTAB_H

#include <QWidget>
#include <QTableWidget>
#include <QGroupBox>
#include <QTextEdit>
#include <QHeaderView>
#include <memory>
#include "spectrumdatafiledefine.h"
#include "dataspecification.h"

// 前向声明
class IMapInfoFeature;
class BasicInfoFeature;

/**
 * @brief 图谱信息tab页面基类
 * 采用组合而非继承的方式，每个图谱类型只需包含需要的特性组件
 */
class MapInfoTab : public QWidget
{
    Q_OBJECT
public:
    explicit MapInfoTab(QWidget *parent = nullptr);
    virtual ~MapInfoTab();

    /**
     * @brief 获取图谱类型代码
     * @return 图谱类型代码
     */
    uint8_t getDataTypeCode() const;

    /**
     * @brief 添加特性组件
     * @param feature 特性组件
     */
    void addFeature(std::shared_ptr<IMapInfoFeature> feature);

    /**
     * @brief 设置基本信息
     * @param spectrumHead 图谱头信息
     */
    void setBasicInfo(const DataSpecificationGW::SpectrumHead& spectrumHead);

    /**
     * @brief 获取特性组件列表
     * @return 特性组件列表的引用
     */
    const std::vector<std::shared_ptr<IMapInfoFeature>>& getFeatures() const { return m_features; }

public:
    /**
     * @brief 设置检测数据类型编码
     * @param code 数据类型编码
     */
    virtual void setDataTypeCode(uint8_t code);

    /**
     * @brief 设置图谱数据长度
     * @param length 数据长度
     */
    virtual void setDataLength(int32_t length);

    /**
     * @brief 设置图谱生成时间
     * @param time 生成时间
     */
    virtual void setCreateTime(const QString& time);

    /**
     * @brief 设置图谱性质
     * @param property 图谱性质
     */
    virtual void setChartProperty(const DataSpecificationGW::SpectrumCharacter& property);

    /**
     * @brief 设置被测设备名称
     * @param name 设备名称
     */
    virtual void setDeviceName(const QString& name);

    /**
     * @brief 设置被测设备编码
     * @param code 设备编码
     */
    virtual void setDeviceCode(const QString& code);

    /**
     * @brief 设置测点名称
     * @param name 测点名称
     */
    virtual void setMeasurementName(const QString& name);

    /**
     * @brief 设置测点编码
     * @param code 测点编码
     */
    virtual void setMeasurementCode(const QString& code);

    /**
     * @brief 设置检测通道标志
     * @param flag 通道标志
     */
    virtual void setChannelFlag(int64_t flag);

    /**
     * @brief 设置存储数据类型
     * @param type 数据类型
     */
    virtual void setDataType(uint8_t type);

    /**
     * @brief 设置幅值单位
     * @param unit 幅值单位
     */
    virtual void setAmplitudeUnit(uint8_t unit);

    /**
     * @brief 设置幅值下限
     * @param lowerLimit 下限值
     */
    virtual void setAmplitudeLowerLimit(float lowerLimit);

    /**
     * @brief 设置幅值上限
     * @param upperLimit 上限值
     */
    virtual void setAmplitudeUpperLimit(float upperLimit);

    /**
     * @brief 设置频带
     * @param band 频带
     */
    virtual void setFrequencyBand(uint8_t band);

    /**
     * @brief 设置下限频率
     * @param lowerFreq 下限频率
     */
    virtual void setLowerFrequency(float lowerFreq);

    /**
     * @brief 设置上限频率
     * @param upperFreq 上限频率
     */
    virtual void setUpperFrequency(float upperFreq);

    /**
     * @brief 设置相位窗数
     * @param count 窗数
     */
    virtual void setPhaseWindowCount(int32_t count);
    /**
     * @brief 设置量化幅值
     * @param n 量化幅值
     */
    virtual void setQuantizedAmplitude(int32_t n) ;
    /**
     * @brief 设置数据点数
     * @param count 数据点数
     */
    virtual void setDataPointCount(int32_t count);

    /**
     * @brief 设置工频周期数p
     * @param num 工频周期数
     */
    virtual void setFrequencyPeriod(int32_t num);
    /**
     * @brief 设置局部放电图谱数据
     * @param byte 局部放电图谱数据
     */
    virtual void setPRPSData(const QByteArray& byte);
    /**
     * @brief 设置局部放电图谱数据
     * @param byte 局部放电图谱数据
     */
    virtual void setPRPDData(const QByteArray& byte);

    /**
     * @brief 设置采样率
     * @param rate 采样率
     */
    virtual void setSamplingRate(int64_t rate);

    /**
     * @brief 设置时域波形图数据
     * @param data 波形图数据
     */
    virtual void setTimeDomainWaveformData(const QString& data);

    /**
     * @brief 设置放电类型概率
     * @param probability 概率值
     */
    virtual void setDischargeTypeProbability(const QString& probability);

    /**
     * @brief 设置超声波传感器类型
     * @param type 传感器类型
     */
    virtual void setUltrasonicSensorType(float type);
    /**
     * @brief 设置脉冲间隔时间单位
     * @param unit 时间单位
     */
    virtual void setPulseIntervalTimeUnit(uint8_t unit);
    /**
     * @brief 设置超声波相位图数据
     * @param data 相位图数据
     */
    virtual void setAEPhaseChartData(const QByteArray& data);

    /**
     * @brief 设置超声波脉冲图数据
     * @param data 脉冲图数据
     */
    virtual void setAEPulseChartData(const QByteArray& data);

    /**
     * @brief 设置超声波时域波形图数据
     * @param data 时域波形图数据
     */
    virtual void setAEWaveformData(const QByteArray& data);

    /**
     * @brief 设置信号最大值
     * @param value 最大值
     */
    virtual void setSignalMaxValue(float value);

    /**
     * @brief 设置信号有效值
     * @param value 有效值
     */
    virtual void setSignalRMSValue(float value);

    /**
     * @brief 设置50Hz相关性
     * @param correlation 相关性值
     */
    virtual void setCorrelation50Hz(float correlation);

    /**
     * @brief 设置100Hz相关性
     * @param correlation 相关性值
     */
    virtual void setCorrelation100Hz(float correlation);

    /**
     * @brief 设置暂态地电压幅值数据
     * @param data 数据
     */
    virtual void setTransientVoltageAmplitudeData(const QString& data);

    /**
     * @brief 设置暂态地电压幅值最大值
     * @param amplitude 最大值
     */
    virtual void setMaxTransientVoltageAmplitude(float amplitude);

    /**
     * @brief 设置脉冲数
     * @param count 脉冲数
     */
    virtual void setPulseCount(int32_t count);

    /**
     * @brief 设置温度单位
     * @param unit 单位
     */
    virtual void setTemperatureUnit(uint8_t unit);

    /**
     * @brief 设置温度点阵宽度
     * @param width 宽度
     */
    virtual void setTemperatureMatrixWidth(int32_t width);

    /**
     * @brief 设置温度点阵高度
     * @param height 高度
     */
    virtual void setTemperatureMatrixHeight(int32_t height);

    /**
     * @brief 设置可见光照片数据长度
     * @param length 数据长度
     */
    virtual void setVisibleLightPhotoDataLength(int32_t length);

    /**
     * @brief 设置红外照片数据长度
     * @param length 数据长度
     */
    virtual void setInfraredPhotoDataLength(int32_t length);

    /**
     * @brief 设置辐射率
     * @param emissivity 辐射率值
     */
    virtual void setEmissivity(float emissivity);

    /**
     * @brief 设置测试距离
     * @param distance 距离值
     */
    virtual void setTestDistance(float distance);

    /**
     * @brief 设置大气温度
     * @param temperature 温度值
     */
    virtual void setAtmosphericTemperature(float temperature);

    /**
     * @brief 设置相对湿度
     * @param humidity 湿度值
     */
    virtual void setRelativeHumidity(int8_t humidity);

    /**
     * @brief 设置反射温度
     * @param temperature 温度值
     */
    virtual void setReflectionTemperature(float temperature);

    /**
     * @brief 设置温宽上限
     * @param upperLimit 上限值
     */
    virtual void setTemperatureUpperLimit(float upperLimit);

    /**
     * @brief 设置温宽下限
     * @param lowerLimit 下限值
     */
    virtual void setTemperatureLowerLimit(float lowerLimit);

    /**
     * @brief 设置红外图谱数据
     * @param data 图谱数据
     */
    virtual void setInfraredChartData(const QByteArray& data);

    /**
     * @brief 设置可见光照片数据
     * @param data 数据
     */
    virtual void setVisibleLightPhotoData(uint8_t data);

    /**
     * @brief 设置红外照片数据
     * @param data 数据
     */
    virtual void setInfraredPhotoData(uint8_t data);

    /**
     * @brief 设置背景文件名称
     * @param fileName 文件名
     */
    virtual void setBackgroundFileName(const QString& fileName);

    /**
     * @brief 设置预留数据
     * @param byte 预留数据
     */
    virtual void setReservedData(const QByteArray& byte);

    /**
     * @brief 设置试验频率
     * @param frequency 频率值
     */
    virtual void setTestFrequency(float frequency);

protected:
    // 初始化UI
    virtual void initUI();
    
    // 图谱类型代码
    uint8_t m_dataTypeCode;
    
    // 特性组件列表
    std::vector<std::shared_ptr<IMapInfoFeature>> m_features;
    
    // 基本信息特性
    std::shared_ptr<BasicInfoFeature> m_basicInfoFeature;
    
    // 主布局
    QWidget* m_mainWidget;
};

/**
 * @brief 图谱信息特性接口
 * 不同类型的图谱可以组合不同的特性
 */
class IMapInfoFeature
{
public:
    virtual ~IMapInfoFeature() = default;
    
    /**
     * @brief 初始化UI组件
     * @param parent 父控件
     * @return 特性的UI组件
     */
    virtual QWidget* initUI(QWidget* parent) = 0;
    
    /**
     * @brief 从图谱数据中加载数据
     * @param spectrum 图谱数据
     */
    virtual void loadFromSpectrum(DataSpecificationGW::Spectrum* spectrum) = 0;
};

/**
 * @brief 基本信息特性
 * 所有图谱都包含的基本信息
 */
class BasicInfoFeature : public IMapInfoFeature
{
public:
    QWidget* initUI(QWidget* parent) override;
    void loadFromSpectrum(DataSpecificationGW::Spectrum* spectrum) override;
    
    // 设置头信息
    void setSpectrumHead(const DataSpecificationGW::SpectrumHead& head);

private:
    QTableWidget* m_basicInfoTable;
    QTableWidgetItem* createTableWidgetItem(const QString& text);
};

/**
 * @brief 幅值特性接口
 * 处理幅值相关的特性
 */
class IAmplitudeFeature : public virtual IMapInfoFeature
{
public:
    // 设置幅值单位
    virtual void setAmplitudeUnit(uint8_t unit) = 0;
    
    // 设置幅值下限
    virtual void setAmplitudeLowerLimit(float lowerLimit) = 0;
    
    // 设置幅值上限
    virtual void setAmplitudeUpperLimit(float upperLimit) = 0;
};

/**
 * @brief 频率特性接口
 * 处理频率相关的特性
 */
class IFrequencyFeature : public virtual IMapInfoFeature
{
public:
    // 设置频带
    virtual void setFrequencyBand(uint8_t band) = 0;
    
    // 设置下限频率
    virtual void setLowerFrequency(float lowerFreq) = 0;
    
    // 设置上限频率
    virtual void setUpperFrequency(float upperFreq) = 0;
    
    // 设置试验频率
    virtual void setTestFrequency(float frequency) = 0;
};

/**
 * @brief AE特性接口
 * 处理声发射相关的特性
 */
class IAEFeature : public virtual IMapInfoFeature
{
public:
    // 设置超声波传感器类型
    virtual void setUltrasonicSensorType(float type) = 0;
    
    // 设置放电类型概率
    virtual void setDischargeTypeProbability(const QString& probability) = 0;
};

// 更多特性接口可以根据需要添加...

#endif // MAPINFOTAB_H
